package com.atguigu.sql.dataframe

import com.atguigu.sql.util.MySparkSessionUtil

/**
 * description ：DataFrame测试
 * author      ：剧情再美终是戏 
 * mail        : 13286520398@163.com
 * date        ：Created in 2020/1/11 9:59
 * modified By ：
 * version:    : 1.0
 */
object DfDemo {

  case class User(age: Int, name: String) extends Serializable

  /*
*  TODO 1、df直接读取外部文件 ：
*     使用spark.read.json读取json文件时，DataFrame可以自动设置字段名和类型 [age: bigint, name: string],使用其他文件就不能识别名称和类型了
 * TODO 2、rdd->df 手动转换：
 *    从rdd转换到df，需要指定类的名称，类型可以自动推导  rdd.toDF("age", "name") ==》 [age: int, name: string]
 * TODO 3、通过样例类反射转换(最常用) 不用设置列的名称和类型了，spark可以自动识别 =》 [age: int, name: string]
 *    val rdd = RDD[User] 首先将rdd转换为 RDD[User]
 *    rdd.toDF
 * TODO 4、api方法
 *    rdd: RDD[Row] 首先将rdd转换为 RDD[Row]
 *    StructType(StructField("age", IntegerType) :: StructField("name", StringType) :: Nil) 配置类型
 *    spark.createDataFrame(rdd, structType) 使用api创建
 */
  def main(args: Array[String]): Unit = {

    // 获取 sparkSession 对象
    val spark = MySparkSessionUtil.get(args)

    // TODO 1、df直接读取
    {
      //    val df: DataFrame = spark.read.json("c:/user-json.txt")
      //
      //    // 将df保存为临时表
      //    df.createTempView("user")
      //
      //    // 使用sql查询
      //    val result = spark.sql("select * from user")
    }

    // TODO 2、rdd->df 手动转换
    {
      //    val rdd: RDD[String] = spark.sparkContext.textFile("c:/user.txt")
      //
      //    // 转换
      //    val rdd2: RDD[(Int, String)] = rdd.map {
      //      line =>
      //        val splits = line.split("\t")
      //        (splits(0).toInt, splits(1))
      //    }
      //
      //    // rdd --> df
      //    import spark.implicits._
      //    val df: DataFrame = rdd2.toDF("age", "name")
      //
      //    df.createTempView("user")
      //
      //    val result = spark.sql("select * from user")
      //
      //    // 输出结果
      //    println(result)
      //    result.show
    }

    // TODO 3、通过样例类反射转换(最常用)
    {
      //    val rdd: RDD[String] = spark.sparkContext.textFile("c:/user.txt")
      //
      //    // 转换
      //    val rdd2: RDD[User] = rdd.map {
      //      line =>
      //        val splits = line.split("\t")
      //        User(splits(0).toInt, splits(1))
      //    }
      //
      //    // rdd --> df
      //    import spark.implicits._
      //    val df: DataFrame = rdd2.toDF
      //
      //    df.createTempView("user")
      //
      //    val result = spark.sql("select * from user")
      //
      //    // 输出结果
      //    println(result)
      //    result.show
    }

    // TODO 4、api方式
    {
      //      val rdd: RDD[String] = spark.sparkContext.textFile("c:/user.txt")
      //
      //      // 转换RDD[Row]
      //      val rdd2: RDD[Row] = rdd.map {
      //        line =>
      //          val splits = line.split("\t")
      //          Row(splits(0).toInt, splits(1))
      //      }
      //
      //      // 设置类型
      //      val structType: StructType = StructType(StructField("age", IntegerType) :: StructField("name", StringType) :: Nil)
      //
      //      // rdd --> df
      //      val df: DataFrame = spark.createDataFrame(rdd2, structType)
      //
      //      df.createTempView("user")
      //
      //      val result = spark.sql("select * from user")
      //
      //      // 输出结果
      //      println(result)
      //      result.show
    }

    // 关闭 sparkSession 资源
    MySparkSessionUtil.close(spark)
  }
}